package org.jeecg.handler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import org.jeecg.common.MessageDecoder;
import org.jeecg.common.MessageEncoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

/**
 * @author xiaoxiyuan
 * @description 服务端初始化
 * @date 2020-06-11 15:14:20
 */
public class MyServerInitializer extends ChannelInitializer<SocketChannel> {


    @Autowired
    private ApplicationContext applicationContext;
    public MyServerInitializer(ApplicationContext applicationContext){
        this.applicationContext=applicationContext;
    }

    /**
     * SocketChannel/ChannelPipeline/ChannelHandlerContext/ChannelHandler的关系
     * 1.SocketChannel和ChannelPipeline一一对应，即新建的Socket都会新建一个全新的ChannelPipeline（简称pipeline）
     * 2.每个ChannelPipeline中含有多个ChannelHandlerContext（简称context）
     * 3.ChannelPipeline内部的多个ChannelHandlerContext形成链表，而ChannelHandlerContext是对ChannelPipeline中添加
     * 的ChannelHandler（简称handler）进行封装
     *
     * 总结：当一个请求进来的时候，会进入SocketChannel对应的ChannelPipeline，
     *      并经过ChannelPipeline的所有ChannelHandler，
     *      这种处理模式就是设计模式中的过滤器模式。
     */

    /**
     * 初始化SocketChannel
     * @param ch
     * @throws Exception
     */
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {

        //创建SocketChannel的同时创建一个ChannelPipeline
        ChannelPipeline pipeline = ch.pipeline();

        //解码器，即向ChannelPipeline中添加解码器处理器
        pipeline.addLast(new MessageDecoder(applicationContext));
        //编码器，即向ChannelPipeline中添加编码器处理器
        pipeline.addLast(new MessageEncoder(applicationContext));
        //服务端处理器，即向ChannelPipeline中添加服务端请求处理器
        pipeline.addLast(new MyServerHandler());
    }
}
